package com.ccsoft.netty.http;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * @author chanchaw
 * @create 2022-07-18 7:57
 * 使用 netty 制作 http 服务器
 * 使用 chrome,edge 无法访问，没有提示
 * firefox 提示：此网址使用了一个通常用于网络浏览以外目的的端口。出于安全原因，Firefox 取消了该请求。
 * 得知是浏览器禁止了使用其他端口访问 http 协议的结果
 * 更换为360浏览器测试通过
 */
public class HttpServer {
    public static void main(String[] args) throws InterruptedException {
        // bossGroup 中一个线程
        NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);
        NioEventLoopGroup workGroup = new NioEventLoopGroup();

        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class)
//                    .childOption(ChannelOption.SO_KEEPALIVE,true)//链接保持活动
                    .childHandler(new ServerInitializer());
            ChannelFuture channelFuture = serverBootstrap.bind(6668).sync();
            // 监听
            channelFuture.addListener(new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture channelFuture) throws Exception {
                    if(channelFuture.isSuccess()) System.out.println("服务端绑定端口6668成功！");
                    else System.out.println("服务端绑定端口失败，请检查端口6668是否被占用！");
                }
            });
            // 监听关闭事件
            channelFuture.channel().closeFuture().sync();
        }finally {
            System.out.println("finally中关闭两个group");
            bossGroup.shutdownGracefully();
            workGroup.shutdownGracefully();
        }

    }
}
